/**************************************************************************
 * @name:  001_日期文件IO.c
 * @brief: 获取当前系统时间，并写入文件log.txt文件中
 * @date:  2025/01/03
 * @author: boluzs@163.com
 * @note:
 *          1. 实现获取当前的系统时间，并以“日期:2025/01/03时间:hh:mm:ss\n”格式
 *             把系统时间写入到一个名为log.txt 的文本中，要求每隔 1s 写入1次。
 *
 *          提示:获取系统时间可以使用 time函数，需要把秒数转换为固定格式的字符串，
 *          可以使用后 ctime 函数或者 localtime 函数实现转换，延时时间可以使用
 *          sleep()函数，以秒为单位
 *
 * @version: 1.0.0
 * @Copyright (c) 2025 by boluzs@163.com, All Rights Reserved.
 **************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    int cnt = 0;
    char *Date_Str = (char *)calloc(1, 128);
    // char Date_Str[128] = {0};

    // 1.利用fopen函数打开一个文件，如果不存在就创建，存在则以追加的方式打开
    FILE *fp = fopen("./log.txt", "a+b");
    if (NULL == fp)
    {
        fprintf(stderr, "open error, errno= %d,%s！\n", errno, strerror(errno));
    }

    // 无限循环尽量使用for()实现，原因是效率更快
    while (cnt < 5)
    {
        time_t timer = time(NULL);
        // 2.获取系统时间并转化为格式化字符串
        struct tm *Date = localtime(&timer);
        sprintf(Date_Str, "日期: %.2d/%.2d/%.2d 时间: %.2d:%.2d:%.2d\n",
                Date->tm_year + 1900,
                Date->tm_mon + 1,
                Date->tm_mday,
                Date->tm_hour,
                Date->tm_min,
                Date->tm_sec);

        // 3.把格式化字符串写入到指定文件中
        fwrite(Date_Str, strlen(Date_Str), 1, fp);

        // 4.刷新文件流
        fflush(fp);

        cnt++;
        // 5.延时1s
        sleep(1);
    }
    fclose(fp);

    // 1.利用fopen函数只读模式打开一个文件
    FILE *rfp = fopen("./log.txt", "r+b");
    if (NULL == rfp)
    {
        fprintf(stderr, "open error, errno= %d,%s！\n", errno, strerror(errno));
    }
    while (fgets(Date_Str, strlen(Date_Str) + 1, rfp))
    {
        printf("%s", Date_Str);
    }

    free(Date_Str);
    fclose(rfp);

    return 0;
}
